package com.mate.cloud.auth.config;

import com.mate.cloud.auth.service.UserService;
import com.mate.cloud.auth.service.impl.CustomUserDetailsService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

/**
 * 授权服务AuthorizationServerConfig配置
 * @author:         MI
 * @email:          448341911@qq.com
 * @createTime:     2024/6/14 18:11
 * @updateUser:     MI
 * @updateTime:     2024/6/14 18:11
 * @updateRemark:   修改内容
 * @version:        v1.0
 */
@Slf4j
@Configuration
public class AuthorizationServerConfig {
    @Resource
    private UserService userService;

    // 配置自定义的 UserDetailsService
    @Bean
    public UserDetailsService userDetailsService() {
        log.info("userDetailsService()");
        return new CustomUserDetailsService(this.userService);
    }
    //滤器链的相关设置
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        log.info("securityFilterChain()");
        // csrfCustomizer.ignoringRequestMatchers(*) 表示所有请求地址都不使用 csrf
        http.csrf(csrfCustomizer -> csrfCustomizer.ignoringRequestMatchers("*"))
                // 授权请求配置（新语法）
                .authorizeHttpRequests(authorize -> authorize
                        // 配置登陆失败页面访问不需要鉴权
                        // 如果不配置，不会跳转到登录失败页面
//                        .requestMatchers("/").permitAll()
//                        .requestMatchers("/index").permitAll()
//                        .requestMatchers("/login").permitAll()
//                        // 因为跳转到登录失败，由于未授权，又重定向到登录页面
//                        .requestMatchers("/fail").permitAll()
                        .anyRequest().authenticated())
                // 你还可以根据需求进行更多的配置，如自定义登录页面的 URL、登录成功或失败的处理逻辑等。
                .formLogin(e -> e.loginProcessingUrl("/login") // 配置处理登陆请求到地址
                        // 自定义登陆页面地址
                        .loginPage("/login")
                        .usernameParameter("userName") // 自定义用户名参数名称
                        .passwordParameter("passWord") // 自定义密码参数名称
//                        .loginProcessingUrl("/login")
                        .defaultSuccessUrl("/index", true)
                        // // 自定义登陆成功页面
                        .defaultSuccessUrl("/success",true)
                        // 登陆失败页面
                        .failureUrl("/fail")
                        .permitAll());

        return http.build();
    }

    // 配置密码编码器
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

}
